<?php

date_default_timezone_set('Europe/Paris'); 

/**
 * @author: MARQUES Guillaume
 * @todo: ?
 * @version: 0.9
**/

require_once 'Widget.class.php';
require_once 'EngineException.class.php';


/* Configuration */
define( "__CACHEPATH__", 'cache/');
define( "__CACHEEXT__", '.ca' );

define( "__WEBROOT__", $_SERVER['DOCUMENT_ROOT']);
define( "__VIEWPATH__", 'vue/');
define( "__CONFIGFILE__", 'engine/engine.config.xml');


/* Fonctions */
//Permet de traduire le texte balisé avec {t}
function templateEngine_translate($text)
{
	preg_match_all("#\{t\}(.+)\{/t\}#i", $text, $matches);

	for($i=0; $i<count($matches[0]); $i++)
		$text=str_replace($matches[0][$i], _($matches[1][$i]), $text);

	return $text;
}

/* Classe */
class TemplateEngine
{
	static public $xmlConfig;
	private $_name; //nom de la page
	private $_template; //nom du template utilisé
	private $_widget = array(); //Widgets contenus dans la page

	private $_meta = array(); //Contenu des balises <meta> de notre

	/**
	 * __contruct
	 * @param $file, file containing the view
	**/
	function __construct()
	{
		//Si il n'y a pas d'arguments, on va chercher le fichier ayant le même nom que la page que l'on execute, dans le dossier vue
		if(func_num_args()==0)
		{
			$file = $_SERVER['PHP_SELF'];
			$file = str_replace('.php','', $file);
			$name = explode( '/', $file);
			$file= $name[count($name)-1];
		}
		else $file= func_get_arg(0);

		$this->_name = $file;


		//Récupération de la configuration de la page
		foreach(TemplateEngine::$xmlConfig->pages->page as  $page)
		{
			if( $this->_name == $page['name'])
			{
    			$this->_template= $page->template;
				$this->_meta['description']= $page->description;
				$this->_meta['title']= $page->title;
			}
		} 


		$this->baseWidget();
	}


	/**
	 * Méthode addWidget, ajout d'un widget à la page
	 * @param $name
	 *			Nom du widget
	 * @param $var
	 *			Variable qui contiendra le widget dans le template
	**/
	public function addWidget($name, $var)
	{
		$this->_widget[$name]= new Widget($name, $this->_name, $var);
	}
	
	/**
	 * Méthode assignToWidget
	 * @param $data = array()
	 *			Tableau permettant d'assigner des valeurs aux variables dont le nom se situe dans la clef
	 * @param $widget
	 *			Widget de destination de ces données
	**/
	public function assignToWidget($data=array(), $widget)
	{
		$this->_widget[$widget]->assign($data);
	}

	/**
	 * Méthode baseWidget
	 * Creer les widgets commun à toutes les pages.
	**/
	private function baseWidget()
	{
		/*foreach(TemplateEngine::$xmlConfig->templates->template as $t)
		{

			if(strcmp($this->_template,$t['name']) == 0)
			{
				echo '-'.$t['name']."--". $this->_template ."<br />";
    			foreach($t->var as $v)
    				$this->addWidget( $v, $v['name']);
    		}
		} */

		$this->addWidget('header', 'head');
		$this->addWidget('listeGenreMusique','nav');
		$this->addWidget('footer', 'footer');
	}

	/**
	 * Méthode display
	 * Permet l'affichage de la page
	**/
	public function display()
	{
		//On récupère l'affichage de tous les widgets

		
		foreach($this->_widget as $widget)
			$html[$widget->getVar()]=$widget->getHTML();

		extract($this->_meta); //Extraction des données <meta>
		extract($html); //Extraction de l'html 

		ob_start(); //Ouverture du tampon
		include __VIEWPATH__.$this->_template.'.php'; //On insère le template
		$result = ob_get_contents(); //Récupérons le contenu du tampon
		ob_end_clean(); //Femerture + nettoyage tampon

		echo $result; //On affiche le résultat
	}

}

//Chargement du fichier de configuration
try
{
	if(!@TemplateEngine::$xmlConfig=simplexml_load_file(__CONFIGFILE__))
		throw new EngineException('TemplateEngine : Fichier de configuration introuvable');
}
catch( EngineException $e)
{
	echo $e;
	exit(); //Sinon l'affichage du site est planté
}